package com.wispx.gateway.config.pojo;

import com.wispx.gateway.common.enums.FlowEnum;
import lombok.Data;

import java.util.HashSet;
import java.util.Set;
import java.util.UUID;

import static com.wispx.gateway.common.constant.GrayConstant.MAX_GRAY_RATIO;
import static com.wispx.gateway.common.constant.GrayConstant.RATIO_GRAY_STRATEGY;
import static com.wispx.gateway.common.constant.LoadBalanceConstant.ROUND_ROBIN_LOAD_BALANCE_STRATEGY;
import static com.wispx.gateway.common.constant.LoadBalanceConstant.VIRTUAL_NODE_NUM;
import static com.wispx.gateway.common.enums.FlowEnum.TOKENBUCKET;

/**
 * 路由实体，yaml中配置
 */
@Data
public class RouteDefinition {
    private String id = UUID.randomUUID().toString();// id
    private String serviceName; // 服务名
    private String uri; // 路由到的uri，格式 xxx/yyy/**
    private int order = 0;// 匹配到多个路由时，选择 order 小的
    private Set<FilterConfig> filterConfigs = new HashSet<>();// 要经过的过滤器的配置(Nacos中配置)

    /**
     * 过滤器 base 配置
     */
    @Data
    public static class FilterConfig {
        /**
         * 过滤器名字
         */
        private String name;

        /**
         * 是否启用
         */
        private boolean enable = true;

        /**
         * 过滤器规则，json 格式
         */
        private String config;
    }

    /**
     * 灰度过滤器配置
     */
    @Data
    public static class GaryFilterConfig {
        /**
         * 灰度策略名字，默认根据流量
         */
        private String strategyName = RATIO_GRAY_STRATEGY;

        /**
         * 最大灰度比例
         */
        private double maxGrayRadio = MAX_GRAY_RATIO;
    }

    /**
     * 负载均衡过滤器配置
     */
    @Data
    public static class LoadBalanceFilterConfig {
        /**
         * 负载均衡策略名字，默认轮询
         */
        private String strategyName = ROUND_ROBIN_LOAD_BALANCE_STRATEGY;

        /**
         * 是否严格轮询
         */
        private boolean isStrictRoundRobin = false;

        /**
         * 一致性Hash算法使用，虚拟节点个数
         */
        private int virtualNodeNum = VIRTUAL_NODE_NUM;
    }

    /**
     * 流控过滤器配置
     */
    @Data
    public static class FlowFilterConfig {
        /**
         * 是否启用
         */
        private boolean enable = false;

        /**
         * 流控类型
         */
        private FlowEnum flowType = TOKENBUCKET;

        /**
         * 容量
         */
        private int capacity = 1 * 1000;

        /**
         * 速率
         * 滑动窗口：窗口大小，单位ms
         * 令牌桶：生成令牌的速率，单位 个/s
         * 漏桶：漏桶速率，单位 ms/个
         */
        private int rate = 200;
    }
}
